package aspectos;

import java.util.HashMap;
import dominio.Monitored;

public aspect ContadorLlamadasAspect {

	private static HashMap<Object, HashMap<String, Integer>> contadorPorPersona = new HashMap<Object, HashMap<String, Integer>>();

	public pointcut contarPorMetodo(Object target) :  execution(@Monitored  * *(..))&& target(target);

	after(Object target) : contarPorMetodo(target)  {
		String nombreMetodo = thisJoinPoint.getSignature().getName();
		HashMap<String, Integer> contadorPorMetodo = porPersona(target);
		contadorPorMetodo.put(nombreMetodo, porMetodo(target, nombreMetodo) + 1);
	}

	public static HashMap<String, Integer> porPersona(Object persona) {
		HashMap<String, Integer> contadorPorMetodo = new HashMap<String, Integer>();
		if (!contadorPorPersona.containsKey(persona)) {
			contadorPorPersona.put(persona, contadorPorMetodo);
		}
		return contadorPorPersona.get(persona);
	}

	private Integer porMetodo(Object persona, String nombre) {

		if (!porPersona(persona).containsKey(nombre)) {
			porPersona(persona).put(nombre, 0);
		}
		return porPersona(persona).get(nombre);
	}

	// PUNTO_1

	public int cantLlamadas(Object persona, String nombreMetodo) {

		return this.porMetodo(persona, nombreMetodo);
	}

}